from 企业员工管理系统.employee import Employee
import os


class EmployeeManageSystem(object):
    def __init__(self):
        # 存放员工数据的文件
        self.employee_data_file = 'employee.data'

        # 上次保存前的员工备份文件，而且只备份一个
        self.employee_data_file_backup = 'employee.data.backup'
        self.employees = []
        # list [{'name': '张三', 'age': 23, 'gender': '男', 'mobile_number': '1234567', 'is_leave': False}
        # {'name': '张三', 'age': 23, 'gender': '男', 'mobile_number': '1234567', 'is_leave': False}]
        self.save_flag = True  # 默认是保存

    # -
    # - 删除员工
    # - 修改员工信息
    # - 查询员工信息
    # - 显示所有员工信息
    # - 保存员工信息
    # - 退出系统等功能。
    def show_hello(self):
        # 显示系统欢迎界面
        print('欢迎进入员工管理系统')
        print('*' * 50)
        print('1.添加员工')
        print('2.删除员工')
        print('3.修改员工')
        print('4.查询员工')
        print('5.查询所有员工')
        print('6.保存员工信息')
        print('7.推出系统')
        print('*' * 50)

    def main(self):
        """员工管理系统的入口"""
        # 加载所有员工
        self.loadAllEmployee()
        while True:
            # 展示系统界面
            self.show_hello()
            num = int(input('请输入功能指令'))
            if num == 1:
                # 添加员工
                self.addEmployee()
            elif num == 2:
                # 删除员工
                self.removeEmployee()
            elif num == 3:
                # 修改员工
                self.updateEmployee()
            elif num == 4:
                # 查看一个员工
                self.showEmployee()
            elif num == 5:
                # 查看所有员工
                self.showAllEmployees()
            elif num == 6:
                # 保存数据
                self.saveEmployee()

            elif num == 7:
                self.go_out()
                print('*' * 50)

    # 退出系统
    def go_out(self):
        """
        退出程序的需求： 如果，员工进行了添加，修改，删除。那么必须要保存到文件中
        1、如果没有保存，则在退出之前要自动保存
        2、怎么样：确定没有保存呢？
        :return:
        """
        if not self.save_flag:  # 员工数据没有保存
            self.saveEmployee()

        print('谢谢！程序退出！')

    # 查找员工
    def showEmployee(self):
        search_name = input('请输入您要查找的员工姓名：')
        for emp in self.employees:
            if emp.name == search_name:
                print('姓名\t' + '年龄\t' + '性别\t' + '手机号码\t' + '是否离职')
                msg = '离职' if emp.is_leave == 1 or emp.is_leave == '1' or emp.is_leave == True else '在职'
                print(f'{emp.name}\t{emp.age}\t{emp.gender}\t{emp.mobile_number}\t{msg}')
                break
        else:
            print(f'没有找到名字叫{search_name}的员工')

    # 修改一个员工
    def updateEmployee(self):
        update_name = input('请输入您要修改的员工姓名：')
        for emp in self.employees:
            self.save_flag = False  # 你完成了一次修改，必须要保存数据

            if emp.name == update_name:
                new_name = input('请输入新的姓名(不修改直接回车):').strip()
                emp.name = new_name if new_name else emp.name
                new_age = input('请输入新的年龄（不修改直接回车）：').strip()
                emp.age = new_age if new_age else emp.age
                new_gender = input('请输入新的性别（不修改请回车）：').strip()
                emp.gender = new_gender if new_gender else emp.gender
                new_mobile_number = input('请输入新的手机号（不修改请回车）：').strip()
                emp.gender = new_mobile_number if new_mobile_number else emp.gender
                new_leave = input('请输入新的是否离职（不修改请回车）1:离职，0：在职').strip()
                if new_leave:
                    emp.is_leave = True if new_leave == 1 else False
                emp.is_leave = new_leave if new_leave else emp.is_leave
                print(emp)
                break
        else:
            print(f'没有找到名字叫{update_name}的员工')

    # 删除一个员工
    def removeEmployee(self):
        remove_name = input('请输入要删除的员工名字')
        for emp in self.employees:
            if emp.name == remove_name:
                self.save_flag = False  # 你完成了一次删除，必须要保存数据
                self.employees.remove(emp)
                break
        else:
            print(f'没有找到名字叫{remove_name}的员工')

    # 添加一个员工
    def addEmployee(self):
        # list [{'name': '张三', 'age': 23, 'gender': '男', 'mobile_number': '1234567', 'is_leave': False}
        name = input('请输入员工姓名')
        age = input('请输入员工年龄')
        gender = input('请输入员工性别')
        mobile_number = input('请输入员工手机号')
        is_leave = int(input('请输入员工是否离职，1表示离职，0表示在职:'))
        new_employee = Employee(name, age, gender, mobile_number, is_leave)
        self.employees.append(new_employee)
        # 4、把刚刚添加的员工信息，输出
        print(new_employee)
        self.save_flag = False

    # 查看所有员工
    def showAllEmployees(self):
        print('姓名\t' + '年龄\t' + '性别\t' + '手机号码\t' + '是否离职')
        for emp in self.employees:
            msg = '离职' if emp.is_leave == 1 or emp.is_leave=='1' or emp.is_leave == True else '在职'
            print(f'{emp.name}\t{emp.age}\t{emp.gender}\t{emp.mobile_number}\t{msg}')

    # 保存员工数据到文件中
    def saveEmployee(self):
        """
        保存的需求和步骤：
        1、先把原来的数据文件备份（如果已经存在备份文件，则把备份文件删除）
        2、创建新文件
        3、写入数据
        4、关闭文件流
        :return:
        """
        # 如果旧的备份文件存在，则删除
        if os.path.exists(self.employee_data_file_backup):
            os.remove(self.employee_data_file_backup)
        if os.path.exists(self.employee_data_file):
            os.rename(self.employee_data_file, self.employee_data_file_backup)

        with open(self.employee_data_file, 'w', encoding='utf-8') as f:
            new_list = []
            for emp in self.employees:
                new_list.append(emp.__dict__)  # 对象转换为字典，存入到list中
            f.write(str(new_list))
        self.save_flag = True

    # 文件中加载和读取员工数据
    def loadAllEmployee(self):
        """
        读取员工数据文件， 把所有的员工信息都放到一个列表中
        :return:
        """
        try:
            f = open(self.employee_data_file, 'r', encoding='utf-8')
        except Exception as err:
            # 如果报错，很有可能第一次启动程序。这个文件还不存在。需要创建一下
            print(err)
            f = open(self.employee_data_file, 'w', encoding='utf-8')
        else:
            data = f.read()
            if data:
                lst = eval(data)  # # 把文件的内容（字符串）,当成Python表达式解析。
                for dict1 in lst:
                    self.employees.append(Employee(dict1['name'], dict1['age'], dict1['gender'], dict1['mobile_number'],
                                                   dict1['is_leave']))

        finally:
            if f:
                f.close()

    # 推出系统
    def unload(self):
        pass


if __name__ == '__main__':
    m = EmployeeManageSystem()
    m.main()
    # manage = EmployeeManageSystem()
    # manage.addEmployee(Employee(name='zhangsan',age=30,gender='男',mobile_number=123432424,is_leave=0))
